package gwtool.drucken.printable;

import java.awt.Font;
import java.awt.Graphics2D;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;

/**
 * Abstrakte Oberklasse für die Seiten mit den Informationen eines Helden.
 * 
 * @author Maik Schiefer-Gehrke
 * @since 3.5
 */
public abstract class AbstractPrintableItem {

	/**
	 * Justierung des Fonts
	 */
	private int fontGroesse;

	protected DateFormat fmt = new SimpleDateFormat("dd.MM.yy");

	/**
	 * Konstruktor für abstrakte Seite. Kein besonderer Inhalt.
	 * 
	 * @since 3.5
	 */
	public AbstractPrintableItem() {

		fontGroesse = 0;
	}

	/**
	 * Liste aller bisher angeforderten Fonts
	 * 
	 * @since 3.5
	 */
	private Map<Integer, Font> fonts = new HashMap<Integer, Font>();

	/**
	 * Gibt einen Font in der entsprechenden SCHRIFTGRÖßE zurück und legt ihn in
	 * einer Liste ab.
	 * 
	 * @param schriftgroesse
	 *            Gewünschte Größe
	 * @return Font in gewünschter Größe
	 * @since 3.6
	 */
	protected Font getFont(int schriftgroesse) {

		if (fonts == null) {
			fonts = new HashMap<Integer, Font>();
		}
		int groesse = schriftgroesse;
		Integer groesseInteger = new Integer(groesse);
		Font font = fonts.get(groesseInteger);
		if (font == null) {
			String fontName = "Times";
			font = new Font(fontName, Font.PLAIN, groesse);
			fonts.put(groesseInteger, font);
		}
		return font;
	}

	/**
	 * Formatiert einen String. Auf mindestens eine Zeichen indem ein BLANK vor
	 * den String gesetzt wird.
	 * 
	 * @param str
	 *            Ein String
	 * @return denselben String oder bei Länge 1 mit Leerzeicen davor
	 * @since 3.5
	 */
	protected String stringFormat(String str) {

		if (str.length() == 1) {
			return (" " + str);
		}
		return str;
	}

	protected String dateToString(long date) {

		if (date == 0) {
			return "";
		}
		return fmt.format(new Date(date));
	}

	/**
	 * Zeichne einen String in einen bestimmten Bereich so, das es im Blocksatz
	 * dargestellt wird.
	 * 
	 * @param x
	 *            X-Koordinte Anfang des String.
	 * @param zeile
	 *            y-Koordinte Anfang des String.
	 * @param xEnd
	 *            X-Koordinte Ende des String.
	 * @param g
	 *            Graphics, in das gezeichnet wird.
	 * @param str
	 *            String der gezeichnet werden soll.
	 */
	protected int drawStringBlock(Graphics2D g, String str, int x, int zeile, int xEnd) {

		int maxLength = xEnd - x;
		String[] parts = str.split(" ");
		String newLine = "";
		for (String p : parts) {
			if (getStringLaenge(newLine + p, g) > maxLength) {
				g.drawString(newLine, x, zeile);
				zeile += 15;
				newLine = "";
			}
			newLine += p;
		}
		g.drawString(newLine, x, zeile);
		return zeile;
	}

	/**
	 * Gibt die Länge eines Stringes
	 * 
	 * @param text
	 *            Der String
	 * @param g
	 *            Das Graphics-Objekt
	 * @return Laenge
	 * @suince 4.7.4
	 */
	protected float getStringLaenge(String text, Graphics2D g) {

		return (float) g.getFontMetrics(g.getFont()).getStringBounds(text, g).getWidth();
	}

	/**
	 * Zeichnet einen String rechtsbündig in das Graphics Objekt
	 * 
	 * @param g
	 *            Das Graphics-Objekt
	 * @param str
	 *            Der zu zeichnende String
	 * @param rechtegrenze
	 *            Die x Koordinate, rechte Begrenzung
	 * @param hoehe
	 *            Die Y Koordinate, untere Begrenzung.
	 */
	protected void drawRechtsbuendig(Graphics2D g, String str, int rechtegrenze, int hoehe) {

		int laenge = (int) getStringLaenge(str, g);
		g.drawString(str, rechtegrenze - laenge, hoehe);
	}

	/**
	 * Formatiert einen String. zentriet den String zwischen x1 und x2
	 * 
	 * @param g
	 *            das Objekt in dem der String gerendert werden soll
	 * @param str
	 *            Ein String
	 * @param linkeGrenze
	 *            erste x koordinate
	 * @param rechteGrenze
	 *            zweite x koordinate
	 * @param hoehe
	 *            die Y koordinate
	 * @since 3.11
	 */
	protected void drawStringCenter(Graphics2D g, String str, int linkeGrenze, int rechteGrenze, int hoehe) {

		int delta = (rechteGrenze - linkeGrenze) / 2;
		int halbeLaenge = (int) getStringLaenge(str, g) / 2;
		g.drawString(str, (linkeGrenze + delta - halbeLaenge), hoehe);
	}
}
